/*
 * errors.h
 *
 *  Created on: 29/apr/2014
 *      Author: kappa
 */

#ifndef ERRORS_H_
#define ERRORS_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "commons.h"
#include "logger.h"

#ifdef _WIN32
	#include <windows.h>
#else

#endif



/*Msg generici*/
static const char  MSG_HEAD [] = "\nERRORE:: ";
static const char  MSG_SPACE [] = " ";
static const char  MSG_END[] = "\nImpossibile proseguire, il programma verra' terminato.\n code: %d ";
static const char  MSG_UNKNOWN_ERR[] = "Errore sconosciuto. ";
static const char  MSG_SYS_ERR[] = "\nNotifica del sistema: %s \nCodice errore: %d";
static const char  MSG_USR_END[] = "\nProgramma terminato dall'utente. %s ";
static const char  MSG_REG_EXP[] = "Errore durante il matching dell'espressione regolare.";
/*MODALITA' APERTURA STREAM o FILE*/
static const char MSG_DEC_MOD[] = "modalita' di apertura file o stream non specificata.";

static const char MSG_DEC_CFG[] = "Configurazione nulla o corrotta, impossibile decodificare.";
/*FILE*/
static const char  MSG_DIR_OPEN[] = "impossibile aprire la diretory.";
static const char  MSG_FILE_OPEN[] = "impossibile aprire il file.";
static const char  MSG_FILE_CLOSE[] = "impossibile chiudere il file.";
static const char  MSG_FILE_READ[] = "impossibile leggere il file.";
static const char  MSG_FILE_WRITE[] = "impossibile scrivere il file.";
static const char  MSG_FILE_TRUNC[] = "impossibile troncare il file.";
static const char  MSG_FCNTL[] = "chiamata ad fcntl fallita.";

/*Processi*/
static const char  MSG_PROC_CREATE[] = "impossibile creare il processo.";
/*Socket SMTP*/
static const char  MSG_SOCK_OPEN[] = "apertura del socket.";
static const char  MSG_SOCK_CLOSE[] = "chiusura del socket.";
static const char  MSG_SOCK_BIND[] = " binding del socket.";
static const char  MSG_SOCK_LISTEN[] = "ascolto sul socket.";
static const char  MSG_SOCK_CONNECT[] = "connessione con l'host fallita.";
static const char  MSG_SOCK_ACCEPT[] = "accept sul socket.";
static const char  MSG_SOCK_WRITE[] = "scrittura sul socket.";
static const char  MSG_SOCK_READ[] = "lettura sul socket.";

static const char  MSG_SOCKINFO_READ[] = "Impossibile leggere le informazioni del socket.";

/*File di configurazione*/
static const char  MSG_CFG_OPEN[] = "apertura del file di configurazione.";
static const char  MSG_CFG_READ[] = "lettura del file di configurazione.";
static const char  MSG_CFG_WRITE[] = "scrittura del file di configurazione.";
static const char  MSG_CFG_CLOSE[] = "chiusura del file di configurazione.";
/*Allocazione memoria*/
static const char  MSG_NO_MEM[] = "Impossibile allocare memoria.";
static const char  MSG_SHMGET[] = "Impossibile allocare memoria condivisa.";
static const char  MSG_SHMAT[] = "Impossibile eseguire l' attach alla memoria condivisa.";
static const char  MSG_SHMDT[] = "Impossibile eseguire il detach della memoria condivisa.";
static const char  MSG_SHMCTL[] = "Impossibile deallocare la memoria condivisa.";
static const char  MSG_SEM_ALLOC[] = "Impossibile allocare il semaforo.";
static const char  MSG_SEM_DEALLOC[] = "Impossibile deallocare il semaforo.";
static const char  MSG_SEM_INIT[] = "Impossibile inizializzare il semaforo.";
static const char  MSG_SEM_WAIT[] = "Impossibile eseguire WAIT sul semaforo.";
static const char  MSG_SEM_POST[] = "Impossibile eseguire POST sul semaforo.";

static const char  MSG_MMAP[] = "Impossibile mappare il file in memoria.";
static const char  MSG_MUNMAP[] = "Impossibile rimuovere il mapping del file in memoria.";
static const char  MSG_READ_IP[] = "Impossibile leggere l'indirizzo IP.";

typedef enum errcode{
	USER_END,
	ERR_FILE_OPEN,
	ERR_FILE_CLOSE,
	ERR_FILE_READ,
	ERR_FILE_WRITE,
	ERR_FILE_TRUNC,
	ERR_FCNTL,
	ERR_DIR_OPEN,
	ERR_CFG_OPEN,
	ERR_CFG_CLOSE,
	ERR_CFG_READ,
	ERR_CFG_WRITE,
	ERR_SOCK_OPEN,
	ERR_SOCK_CLOSE,
	ERR_SOCK_BIND,
	ERR_SOCK_CONNECT,
	ERR_SOCK_LISTEN,
	ERR_SOCK_ACCEPT,
	ERR_SOCK_WRITE,
	ERR_SOCK_READ,
	ERR_SOCKINFO_READ,
	ERR_LOG_OPEN,
	ERR_LOG_CLOSE,
	ERR_LOG_WRITE,
	ERR_NO_MEM,
	ERR_DEC_MOD,
	ERR_DEC_CFG,
	ERR_PROC_CREATE,
	ERR_REG_EXP,
	ERR_SHMGET,
	ERR_SHMAT,
	ERR_SHMDT,
	ERR_SHMCTL,
	ERR_SEM_ALLOC,
	ERR_SEM_DEALLOC,
	ERR_SEM_INIT,
	ERR_SEM_WAIT,
	ERR_SEM_POST,
	ERR_MMAP,
	ERR_MUNMAP,
	ERR_RELAY_MAIL,
	ERR_READ_IP,
	ERR_CODE_SIZE
} ERRCODE;

void notifyError(ERRCODE, int, int, ...);

#endif /* ERRORS_H_ */
